package com.irdstudio.efp.esb.api.common;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import org.apache.logging.log4j.ThreadContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;
import com.irdstudio.efp.esb.common.constant.ESBClientConstance;
import com.irdstudio.efp.esb.common.constant.EsbSysHeadEnums;
import com.irdstudio.efp.esb.common.server.req.EsbReqAppHeadBean;
import com.irdstudio.efp.esb.common.server.req.EsbReqServiceBean;
import com.irdstudio.efp.esb.common.server.req.EsbReqSysHeadBean;
import com.irdstudio.efp.esb.common.server.resp.EsbRespAppHeadBean;
import com.irdstudio.efp.esb.common.server.resp.EsbRespRetInfBean;
import com.irdstudio.efp.esb.common.server.resp.EsbRespServiceBean;
import com.irdstudio.efp.esb.common.server.resp.EsbRespSysHeadBean;
import com.irdstudio.basic.framework.core.constant.DateFormatConstant;
import com.irdstudio.basic.framework.core.util.TimeUtil;
import com.irdstudio.basic.framework.core.util.TraceUtil;

/**
 * 封装ESB响应报文对象处理类
 * 
 * @author huangwb
 * @since 2019年1月18日 下午7:29:14
 * @version 1.0
 */
public class EsbRespServiceBeanCreator {
	private static Logger logger = LoggerFactory.getLogger(EsbRespServiceBeanCreator.class);

	/**
	 * 封装ESB响应报文对象
	 * 
	 * @param esbReqServiceBean
	 *            ESB请求报文对象
	 * @param esbRespBodyBean
	 *            ESB响应报文体对象
	 * @param retSt
	 *            返回状态
	 * @param retCd
	 *            返回代码
	 * @param retMsg
	 *            返回信息
	 * @return
	 * @author huangwb
	 * @since 2019年1月20日 上午11:38:18
	 * @version 1.0
	 */
	public static EsbRespServiceBean buildesbRespServiceBean(EsbReqServiceBean esbReqServiceBean, String esbRespBodyBean, String retSt,
			String retCd, String retMsg) {
		logger.info("封装ESB响应报文对象开始");
		String PvdrSysID = "";
		ThreadContext.put(TraceUtil.PVDRSYSID, PvdrSysID);
		TraceUtil.setPvdrSysID(PvdrSysID);

		ThreadContext.put(TraceUtil.RETST, retSt);// 返回状态
		TraceUtil.setRetSt(retSt);
		ThreadContext.put(TraceUtil.RETCD, retCd); // 返回代码
		TraceUtil.setRetCd(retCd);
		ThreadContext.put(TraceUtil.RETMSG, retMsg);// 返回信息
		TraceUtil.setRetMsg(retMsg);

		EsbRespServiceBean esbRespServiceBean = new EsbRespServiceBean();// ESB响应报文对象

		EsbReqSysHeadBean esbReqSysHeadBean = esbReqServiceBean.getSysHead();
		esbRespServiceBean.setSysHead(buildRespSysHead(esbReqSysHeadBean, retSt, retCd, retMsg));

		EsbReqAppHeadBean esbReqAppHeadBean = esbReqServiceBean.getAppHead();
		esbRespServiceBean.setAppHead(buildRespAppHead(esbReqAppHeadBean));

		esbRespServiceBean.setBODY(JSONObject.parseObject(esbRespBodyBean));
		logger.info("封装ESB响应报文对象结束");
		return esbRespServiceBean;
	}

	/**
	 * 设置 ESB响应应用头对象
	 * 
	 * @param esbReqAppHeadBean
	 *            ESB请求应用头对象
	 * @return
	 * @author huangwb
	 * @since 2018年12月17日 下午5:46:48
	 * @version 1.0
	 */
	private static EsbRespAppHeadBean buildRespAppHead(EsbReqAppHeadBean esbReqAppHeadBean) {
		logger.info("设置 ESB响应应用头对象开始");
		EsbRespAppHeadBean esbRespAppHeadBean = new EsbRespAppHeadBean();// ESB响应应用头
		// 以下值同请求参数
		esbRespAppHeadBean.setInstId(esbReqAppHeadBean.getInstId());// 机构Id
		esbRespAppHeadBean.setUsrNo(esbReqAppHeadBean.getUsrNo());// 用户编号
		esbRespAppHeadBean.setUsrTp(esbReqAppHeadBean.getUsrTp());// 用户类型
		esbRespAppHeadBean.setUsrLvl(esbReqAppHeadBean.getUsrLvl());// 用户级别
		esbRespAppHeadBean.setTlrSrlNo(esbReqAppHeadBean.getTlrSrlNo());// 柜员流水号
		esbRespAppHeadBean.setCnlTp(esbReqAppHeadBean.getCnlTp());// 渠道类型
		esbRespAppHeadBean.setCnlDtlTp(esbReqAppHeadBean.getCnlDtlTp());// 渠道细分
		logger.info("设置 ESB响应应用头对象结束");
		return esbRespAppHeadBean;
	}

	/**
	 * 设置 ESB响应系统头
	 * 
	 * @param esbReqSysHeadBean
	 *            ESB请求系统头
	 * @param retSt
	 *            返回状态
	 * @param retCd
	 *            返回代码
	 * @param retMsg
	 *            返回信息
	 * @return
	 * @author huangwb
	 * @since 2018年12月17日 下午5:46:08
	 * @version 1.1
	 */
	private static EsbRespSysHeadBean buildRespSysHead(EsbReqSysHeadBean esbReqSysHeadBean, String retSt, String retCd, String retMsg) {
		logger.info("设置 ESB响应系统头开始");
		EsbRespSysHeadBean esbRespSysHeadBean = new EsbRespSysHeadBean();// ESB响应系统头
		// 根据返回的值进行封装
		esbRespSysHeadBean.setRetSt(retSt);
		List<EsbRespRetInfBean> retInfArry = new ArrayList<EsbRespRetInfBean>();// ESB返回信息数组
		EsbRespRetInfBean retInf = new EsbRespRetInfBean();// 返回信息对象
		retInf.setRetCd(retCd);
		retInf.setRetMsg(retMsg);
		retInfArry.add(retInf);
		esbRespSysHeadBean.setRetInfArry(retInfArry);
		// 以下值同请求参数
		esbRespSysHeadBean.setSvcCd(esbReqSysHeadBean.getSvcCd());// 服务代码
		esbRespSysHeadBean.setScnCd(esbReqSysHeadBean.getScnCd());// 服务应用场景
		esbRespSysHeadBean.setCnsmrSysID(esbReqSysHeadBean.getCnsmrSysID());// 消费方系统编号
		esbRespSysHeadBean.setCnsmrSrlNo(esbReqSysHeadBean.getCnsmrSrlNo());// 消费方流水号
		esbRespSysHeadBean.setGlblSrlNo(esbReqSysHeadBean.getGlblSrlNo());// 全局流水号
		esbRespSysHeadBean.setTxnDt(TimeUtil.getTimeStampByPattern(DateFormatConstant.DATE_FORMAT_COMPACT));// 交易日期
		esbRespSysHeadBean.setTxnTm(TimeUtil.getTimeStampByPattern(DateFormatConstant.TIME_FORMAT_COMPACT));// 交易时间
		esbRespSysHeadBean.setPvdrSysID(ESBClientConstance.CnsmrSysNo);// 提供方系统编号
		esbRespSysHeadBean.setPvdrSrlNo(esbReqSysHeadBean.getGlblSrlNo());// 提供方流水号
		esbRespSysHeadBean.setOrgnlCnsmrSysID(esbReqSysHeadBean.getOrgnlCnsmrSysID());// 原始消费方系统编号
		esbRespSysHeadBean.setOrgnlTmlIdNo(esbReqSysHeadBean.getOrgnlTmlIdNo());// 原始终端标识号
		esbRespSysHeadBean.setTmlIdNo(esbReqSysHeadBean.getTmlIdNo());// 终端标识号
		esbRespSysHeadBean.setOrgnlCnsmrSvcNo(esbReqSysHeadBean.getOrgnlCnsmrSvcNo());// 原始消费方服务器编号
		esbRespSysHeadBean.setCnsmrSvcNo(esbReqSysHeadBean.getCnsmrSvcNo());// 消费方服务器编号
		try {
			esbRespSysHeadBean.setPvdrSvcNo(InetAddress.getLocalHost().getHostAddress()); // 提供方服务器编号
		} catch (UnknownHostException e) {
			logger.error("获取提供方服务器编号出错");
		}
		esbRespSysHeadBean.setUsrLng(EsbSysHeadEnums.UsrLngEnum.CHINESE.toString());// 用户语言
		esbRespSysHeadBean.setFileFlg(esbReqSysHeadBean.getFileFlg()); // 文件标志
		esbRespSysHeadBean.setMACVal(esbReqSysHeadBean.getMACVal()); // MAC值
		esbRespSysHeadBean.setMACFctr(esbReqSysHeadBean.getMACFctr()); // MAC因子
		esbRespSysHeadBean.setPINSd(esbReqSysHeadBean.getPINSd()); // PIN种子
		esbRespSysHeadBean.setEryptMd(esbReqSysHeadBean.getEryptMd()); // 加密方式
		esbRespSysHeadBean.setSvcVerNo(esbReqSysHeadBean.getSvcVerNo()); // 服务版本号
		esbRespSysHeadBean.setPrtyLvl("00"); // 优先级别
		esbRespSysHeadBean.setVerfFlg(esbReqSysHeadBean.getVerfFlg()); // 校验标志
		esbRespSysHeadBean.setSysRsrv(""); // 系统保留
		logger.info("设置 ESB响应系统头结束");
		return esbRespSysHeadBean;
	}
}
